package controllers;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang.time.DateUtils;

import models.Atendente;
import models.Consulta;
import models.Dentista;
import models.Paciente;
import models.Procedimento;
import play.Logger;
import play.data.validation.Required;
import play.data.validation.Valid;
import play.mvc.*;
import utils.Security;


public class Atendentes extends Controller {

	/**
	 * Recupera e exibe lista de Atendentes cadastrados.
	 */
	public static void index() {

		List<Atendente> atendentes = Atendente.all().fetch();

		render(atendentes);
	}

	/**
	 * Recupera um atendente através do seu id.
	 * @param id
	 */
	public static void show(long id)
	{

		Atendente atendente = Atendente.findById(id);

		render("@form",atendente);
	}

	/**
	 * Exibe o form de cadastro de atendentes.
	 */
	public static void create()
	{
		Security.deny();

		render("@form");
	}

	/**
	 * Salva (persiste) o atendente na base.
	 * @param atendente
	 */
	public static void save(@Valid Atendente atendente)
	{
		Security.deny();

		if (validation.hasErrors())
		{
			flash.error("Favor corrigir os erros a seguir");
			render("@form",atendente);
		}
		atendente.save();
		flash.success("Salvo com sucesso");
		index();
	}

	/**
	 * Exclui o atendente pelo seu id.
	 * @param id
	 */
	public static void delete(long id)
	{
		Atendente atendente = Atendente.findById(id);
		atendente.delete();
		flash.success("Apagado com sucesso");
		index();
	}

	/**
	 * Exibe a tela para agendamento da consulta a ser realizada.
	 */
	public static void realizaConsulta()
	{
		List<Dentista> dentistas = Dentista.all().fetch();
		List<Paciente> pacientes = Paciente.all().fetch();
		List<Consulta> consultas = Consulta.all().fetch();
		List<Consulta> procedimentos = Procedimento.all().fetch();
		render(dentistas,pacientes,consultas,procedimentos);
	}

	/**
	 * Efetua o agendamento da consulta a ser realizada.
	 */
	public static void criarConsulta(@Valid Consulta consulta)
	{
		Security.deny();

		Logger.info("%s", consulta);

		if (consulta.dataHora!=null)
		{
			//Verifica se o dentista já não tem consulta
			// marcada naquele horário

			Date dataHoraAnterior = DateUtils.addMinutes(consulta.dataHora, -59);
			Date dataHoraPosterior = DateUtils.addMinutes(consulta.dataHora, 59);
			List<Consulta> consultaMarcada = Consulta.find("dentista=? and dataHora>=? and dataHora<=?", 
					consulta.dentista,dataHoraAnterior,dataHoraPosterior).fetch();

			if (!consultaMarcada.isEmpty())
			{
				validation.addError("consulta.dataHora", "Horário já está marcado para o dentista " + consulta.dentista.nome);
			}
			
			// Verifico se o dentista pode atender
			
			// manha ou tarde?
			if (consulta.dataHora.getHours()<=12)
			{//manha
				if (consulta.dataHora.getHours()<consulta.dentista.horaInicialManha
						|
						consulta.dataHora.getHours()>consulta.dentista.horaFinalManha)
				{
					validation.addError("consulta.dataHora", "Horário não disponível para " + consulta.dentista.nome + " (" + consulta.dentista.getHorarioCompleto() + ")");
				}
			}
			else
			{//tarde
				if (consulta.dataHora.getHours()<consulta.dentista.horaInicialTarde
						|
						consulta.dataHora.getHours()>consulta.dentista.horaFinalTarde)
				{
					validation.addError("consulta.dataHora", "Horário não disponível para " + consulta.dentista.nome);
				}
			}
		}

		if (validation.hasErrors())
		{
			List<Dentista> dentistas = Dentista.all().fetch();
			List<Paciente> pacientes = Paciente.all().fetch();	
			List<Consulta> consultas = Consulta.all().fetch();
			List<Procedimento> procedimentos = Procedimento.all().fetch();

			flash.error("Favor corrigir os erros a seguir");
			render("@realizaConsulta",dentistas,pacientes,consulta,consultas,procedimentos);
		}

		consulta.save();
		flash.success("Consulta criada");
		Atendentes.realizaConsulta();

	}
	
	/**
	 * Efetua o cancelamento da consulta.
	 */
	public static void cancelaConsulta(long id)
	{
		Consulta consulta = Consulta.findById(id);
		consulta.delete();
		flash.success("Consulta cancelada");
		Atendentes.realizaConsulta();
		
	}

}
